/***********************************************************************************************************************
 * ############################################# Application AdewebLite #############################################
 * AdewebLite Android est une application permettant de consulter des emplois du temps fournis par l'université UHP
 * avec ou sans connexion internet (informations gardées en mémoire à chaque synchronisation). Et utilisant la web
 * API ADE pour collecter les données.
 * @author Andrianjafintrimo Victor, Zanette Sébastien
 * 
 * Basée sur l'application du même nom, utilisant le flux RSS (données à traiter), de :
 * @author Schnell Michaël, Zanette Sébastien
 * **********************************************************************************************************************
 */

package ade.screen;

import ade.database.Database;
import ade.exception.AAAException;
import ade.schedule.Schedule;
import ade.schedule.UpdateManager;
import ade.screen.schedule.parameters.ScheduleName;
import ade.screen.schedule.parameters.SchedulePeriod;
import ade.screen.schedule.parameters.ScheduleProjectId;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;

/**
 * Vue affichant le formulaire pour modifier un emploi du temps.
 * 
 * @author Zanette Sébastien, @author Andrianjafintrimo Victor
 */
public class EditScheduleScreen extends CreateScheduleScreen {

	/**
	 * Emploi du temps original de l'emploi du temps à modifier.
	 */
	protected Schedule originalS ;

	/**
	 * Initialise la vue.
         * 
         * @param savedInstanceState 
         */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState, "Edition d'un emploi du temps");
	}// onCreate(Bundle)

	/**
         * Initialise les champs de la liste avec les valeurs de l'emploi du temps à modifier.
	 */
	@Override
	public void init() {
		Database db = new Database() ; 
		Bundle b = this.getIntent().getExtras() ;
		String name = b.getString("ade.screen.nameCurrentSchedule") ;
		try {
			this.originalS = db.getScheduleWithName(name) ;
		} catch (AAAException e) {
			// The edited schedule doesn't exit, 
			// go back to the previous page
			this.onBackPressed() ;
		}// try

                String ressources = this.originalS.getRessources();
                if (this.originalS.getStudentNum().length()>0 && !ressources.equals(""))
                    ressources = ressources+"|"+this.originalS.getStudentNum();
                else if (this.originalS.getStudentNum().length()>0 && ressources.equals(""))
                    ressources = this.originalS.getStudentNum();
                
		this.init(this.originalS.getName(),
				ressources, 
				Integer.toString(this.originalS.getPeriod()), 
				Integer.toString(this.originalS.getProjectId())) ;
	}// init()

	/**
	 * Retourne une instance de {@code OnClickListener} pour l'enregistrement.
	 * 
	 * @return	instance de {@code OnClickListener} pour l'enregistrement
	 */
	@Override
	protected OnClickListener getSaveListener() {
		return new SaveListener(this) ;
	}// getSaveListener()

	/**
	 * OnClickListener pour le bouton "enregistrer".
	 * 
         * <p>Retrouve la donnée depuis le formulaire et insère l'emploi du temps dans la base de données si possible.</p>
	 * 
         * @author  Zanette Sébastien, Andrianjafintrimo Victor
	 */
	class SaveListener implements OnClickListener {

		/**
                 * Vue contenant le composant attaché à l'écouteur.
		 */
		protected EditScheduleScreen container ;

		/**
		 * Constructeur. 
		 * 
		 * @param 	container vue qui content le composant attaché à l'écouteur
		 */
		public SaveListener(EditScheduleScreen container) {
			super();
			this.container = container;
		}// SaveListener(EditScheduleScreen)
                
                /**
                 * Définition des actions du clique sur le composant attaché.
		 * 
		 * @param	actualView vue du composat qui à reçu un click event
		 */
		public void onClick(View actualView) {
			//Fixe les champs avec les données récupérées
			String name       = this.container.getById(ScheduleName.FIELD_ID).getValue(this.container.getFields()).toString() ;
			String ressources = this.container.getScheduleResources() ;
                        StringBuilder studentNum = new StringBuilder("") ;
                        StringBuilder ressNum =new StringBuilder("") ;
                            //Séparation des ressources en numéros étudiant et numéros de ressources
                            for(String r : ressources.split("\\|")){
                                if(r.length() == 8){
                                  studentNum.append("|");
                                  studentNum.append(r);
                                }
                                else {
                                  ressNum.append("|");
                                  ressNum.append(r);                                 
                                }
                            }
			int period        = (Integer) this.container.getById(SchedulePeriod.FIELD_ID).getValue(this.container.getFields()) ;
			int projectId     = (Integer) this.container.getById(ScheduleProjectId.FIELD_ID).getValue(this.container.getFields()) ;

                        String studentNumber = studentNum.toString() ;
                        String ressNumber = ressNum.toString() ;
                        if (studentNumber.length()>0) {
                            studentNumber = studentNumber.substring(1);
                        }
                        if (ressNumber.length()>0) {
                            ressNumber = ressNumber.substring(1) ;
                        }			                      

			//Test des données et mise à jour de l'emploi du temps			
			try {
				Schedule original = this.container.getOriginalSchedule() ;
                                String lastModif  = original.getLastModif() ;
                                int status = original.getStatus() ; 
                                String created = original.getCreated() ;
                                
                                Schedule newS = new Schedule(projectId, name, ressNumber, period, lastModif, status, created, studentNumber) ;
                                Database db = new Database() ;
				//Si l'utilisateur a fait des changements
                                if (!original.equals(newS)) {
                                        if (original.getName().equals(newS.getName()) && container.isNetworkAvailable()) { 
                                            //L'utilisateur a changé le nom de l'emploi du temps
                                            newS.validateOnUpdate();                                            
                                        } else {
                                            newS.validate(db);
                                            //Change le statut sur le nouveau nom de l'emploi du temps
                                            UpdateManager um = UpdateManager.getInstance();
                                            um.setScheduleStatus(newS.getName(), um.getScheduleStatus(original.getName()));
                                        }// if
					db.updateSchedule(original.getName(), newS) ;
					// Recherche des cours uniquement si un champ autre que le nom a changé
					if ((!original.getRessources().equals(newS.getRessources())
                                                        || (!original.getStudentNum().equals(newS.getStudentNum()))
							|| (original.getProjectId() != newS.getProjectId())
							|| (original.getPeriod() != newS.getPeriod())) && container.isNetworkAvailable()) {
						UpdateManager.getInstance().addQueue(newS.getName()) ;
					}// if
				}// if
				//TODO Issue 3 (-> GC)

				this.container.onBackPressed() ;
			} catch (AAAException e) {
				Toast.makeText(this.container, e.getMessage(), Toast.LENGTH_LONG).show() ;
			}// try
		}// onClick(View)  
		
	}// class SaveListener

	/**
         * Retourne l'emploi du temps original de l'emploi du temps à modifier.
	 * @return  {@code Schedule}
	 */
	public Schedule getOriginalSchedule() {
		return this.originalS;
	}// getOriginalSchedule()

	
        /**
         *  Utilisé pour l'affichage de messages d'erreurs si un emploi du temps de peut pas être mis à jour.
	 * Si l'emploi du temps à modifier a été mis à jour, rejette les modifications non enregistrées.
         * @param args liste contenant le nom et l'état de l'emploi du temps
         */
	@Override
	public void onUpdate(Object... args) {
		super.onUpdate(args) ;
		try {
			// Si l'emploi du temps à modifier a été mis à jour, rejette les modifications non enregistrées
			// et retourne à la vue précédente.
			String scheduleName = (String)  args[0] ;
			int scheduleState   = (Integer) args[1] ;
			if (scheduleName.equals(this.originalS.getName()) 
					&& (scheduleState == UpdateManager.STATUS_UPDATING)) {
				this.onBackPressed() ;
			}// if
		} catch (Exception e) {}// try
	}// onUpdate(Object...)

}// class EditScheduleScreen
